﻿#define _CRT_SECURE_NO_WARNINGS 1
/*
1.什么是柔性数组
在C99语法中，结构中的最后一个元素允许是未知大小的数组，这就叫做柔性数组成员。
## 2.两种语法形式
*/
//第一种：结构体中最后一个数组的大小指定为0
//struct S {
//	int n;
//	int a[0];//柔性数组成员
//};
//第二种：结构体中的最后一个数组未指定大小
//struct S {
//	int n;
//	int a[];//柔性数组成员
//};

////柔性数组方案一
//#include<stdio.h>
//#include<stdlib.h>
//#include<string.h>
//#include<errno.h>
//
//struct S {
//	int n;
//	char c;
//	int arr[0];//柔性数组成员
//};
//int main() {
//	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));
//	/*
//	(1)内存中放的是struct S类型的数据，开辟空间的地址应该是struct S*
//	(2)结构体大小：包含除柔性数组成员的其他成员
//	(3)10*sizeof(int)是柔性数组里打算放的东西，为柔性数组留了10个整型
//	
//	*/
//	//判断是否开辟成功
//	if (ps == NULL) {
//		printf("%s\n",strerror(errno));
//		return 1;
//	}
//	//使用
//	ps->n = 55;
//	ps->c = 'y';
//	int i = 0;
//	for (i = 0; i < 10; i++) {
//		ps->arr[i] = i;
//	}
//	for(i = 0; i < 10; i++) {
//		printf("%d\n", ps->arr[i]);
//	}
//	//调整arr数组的大小
//	struct S* ptr = (struct S*)malloc(sizeof(struct S) + 20 * sizeof(int));
//	if (ptr == NULL) {
//		printf("%s\n", strerror(errno));
//		return 1;
//	}
//	else {
//		ps = ptr;//开辟成功的话最好用原来维护开辟好的空间的ps指针来维护这块空间
//	}
//	//使用
//	//...
//
//	//释放
//	free(ps);
//	ps = NULL;
//
//	return 0;
//}
/*
在这个方案中柔性数组的柔性怎么体现出来的?
 ✨如果将结构体中arr长度写做10，结构体类型一旦创建好了，数组大小就不能改变了。不能每次使用的时候才进行更改数组的长度，因为一旦编译，结构体中的数组大小就固定了。
 ✨而柔性数组成员的空间是malloc出来的，malloc的空间可用realloc调整，那么这个数组的大小就柔性可变了。
*/


/*
不用柔性数组，实现数组可大可小的思路
==结构中指针方案二==
*/
//#include<stdio.h>
//#include<stdlib.h>
//struct S {
//	int n;
//	char c;
//	int* arr;
//};
//int main() {
//	struct S* ps = (struct S*)malloc(sizeof(struct S));
//	if (ps == NULL) {
//		perror("malloc");
//		return 1;
//	}
//	int* ptr = (int*)malloc(10 * sizeof(int));
//	if (ptr == NULL) {
//		perror("malloc");
//		return 1;
//	}
//	else {
//		ps->arr = ptr;//开辟成功，把地址交给arr,arr指向这块空间
//		/*
//		arr指向这块空间，那么arr就可以像数组一样访问这块空间
//		这块空间是malloc来的，所以不够时就可以用realloc进行扩容
//		*/
//	}
//
//	//使用
//	ps->n = 100;
//	ps->c = 'y';
//	int i = 0;
//	for (i = 0; i < 10; i++) {
//		ps->arr[i] = i;
//		/*
//		因为arr里面放的是这块空间的起始地址，和数组名一样
//		把这块空间想象成连续的数组，数组名表示首元素的地址
//		*/
//	}
//	//打印
//	for (i = 0; i < 10; i++) {
//		printf("%d ", ps->arr[i]);
//	}
//	//扩容-->调整arr数组的大小
//	ptr = realloc(ps->arr, 20 * sizeof(int));
//	if (ptr == NULL) {
//		perror("realloc");
//		return 1;
//	}
//	else {
//		ps->arr = ptr;
//	}
//
//	//使用
//	//...
//
//	//释放
//	//注意：释放动态内存开辟空间的顺序：后开辟的先释放
//	free(ps->arr);
//	ps->arr = NULL;
//	free(ps);
//	ps = NULL;
//
//	return 0;
//}